const express = require('express');
const cors = require('cors');
const bodyParser = require('body-parser');
const axios = require('axios');
const dotenv = require('dotenv');

// 加载环境变量
dotenv.config();

const app = express();
const PORT = process.env.PORT || 8080;
const AI_SERVICE_URL = process.env.AI_SERVICE_URL || 'http://localhost:8088';

// 启用跨域请求，设置详细的CORS配置
app.use(cors({
    origin: ['http://localhost:5173', 'http://127.0.0.1:5173'],
    methods: ['GET', 'POST', 'OPTIONS'],
    allowedHeaders: ['Content-Type', 'Accept', 'Cache-Control', 'Connection', 'X-Requested-With'],
    exposedHeaders: ['Content-Type', 'Content-Length', 'Transfer-Encoding'],
    credentials: true
}));

// 解析 JSON 请求体
app.use(bodyParser.json());

app.post('/v1/chat/stream/sse', async (req, res) => {
    console.log('收到代理请求 /v1/chat/stream/sse:', JSON.stringify(req.body));

    // 检查模型ID
    const modelId = req.body.modelId || 'deepseek-chat';
    const userPrompt = req.body.userPrompt || '';
    const chatId = req.body.chatId || `conversation-${Date.now()}`;

    // 设置响应头 - 明确指定UTF-8编码
    res.setHeader('Content-Type', 'text/event-stream; charset=utf-8');
    res.setHeader('Cache-Control', 'no-cache');
    res.setHeader('Connection', 'keep-alive');
    res.setHeader('Transfer-Encoding', 'chunked');
    // 确保CORS响应头
    res.setHeader('Access-Control-Allow-Origin', req.headers.origin || '*');
    res.setHeader('Access-Control-Allow-Headers', 'Content-Type, Accept, Cache-Control, Connection');
    res.setHeader('Access-Control-Allow-Methods', 'GET, POST, OPTIONS');
    res.setHeader('Access-Control-Allow-Credentials', 'true');

    try {
        // 验证请求参数
        if (!userPrompt) {
            throw new Error('用户提示信息不能为空');
        }

        // 构建请求数据
        const requestData = {
            modelId,
            chatId,
            userPrompt
        };

        // 创建请求配置
        const config = {
            url: `${AI_SERVICE_URL}/v1/chat/stream/sse`,
            method: 'post',
            headers: {
                'Content-Type': 'application/json',
                'Accept': 'text/event-stream'
            },
            data: requestData,
            responseType: 'stream' // 设置响应类型为流
        };

        try {
            console.log(`正在调用远程大模型API: ${AI_SERVICE_URL}/v1/ai/chat`);

            // 发送请求到AI服务
            const response = await axios(config);

            console.log('成功连接到远程大模型API，正在流式传输响应...');
            console.log('响应头信息:', JSON.stringify(response.headers));

            // 添加数据开始标记
            //res.write('data: {"type":"start"}\n\n');
            if (res.flush) res.flush();

            // 将AI服务的流式响应直接传递给客户端，不做任何处理
            response.data.on('data', (chunk) => {
                try {
                    // 解析数据并格式化为SSE格式
                    const chunkStr = chunk.toString();
                    console.log('服务端接收到的流式数据片段:', chunkStr);

                    // 确保数据按照SSE格式发送，每行以data:开头
                    //const formattedData = `data: ${chunkStr}\n\n`;
                    const formattedData = chunkStr;

                    res.write(formattedData);
                    // 刷新响应流，确保数据立即发送
                    if (res.flush) {
                        res.flush();
                    }
                } catch (err) {
                    console.error('写入响应时出错:', err);
                }
            });

            response.data.on('end', () => {
                console.log('远程大模型API响应结束');
                if (!res.writableEnded) {
                    res.end();
                }
            });

            // 错误处理
            response.data.on('error', (err) => {
                console.error('流数据传输错误:', err);
                if (!res.writableEnded) {
                    res.status(500).end(JSON.stringify({
                        error: '流数据传输中断'
                    }));
                }
            });
        } catch (error) {
            console.error('AI服务请求失败:', error.message);
            if (!res.headersSent) {
                res.status(502).json({
                    error: {
                        message: `无法连接到AI服务器(${AI_SERVICE_URL})，请检查服务是否可用`,
                        code: 'AI_SERVICE_UNAVAILABLE',
                        details: error.message
                    }
                });
            } else if (!res.writableEnded) {
                res.end();
            }
        }
    } catch (error) {
        console.error('处理聊天请求时出错:', error);

        // 发送错误响应
        if (!res.headersSent) {
            res.status(400).json({
                error: {
                    message: error.message || '处理请求时发生错误',
                    code: error.code || 'BAD_REQUEST'
                }
            });
        } else if (!res.writableEnded) {
            res.end();
        }
    }
});

// 添加健康检查接口
app.get('/health', (req, res) => {
    res.status(200).json({
        status: 'ok',
        timestamp: new Date().toISOString(),
        aiServiceUrl: AI_SERVICE_URL
    });
});

// 启动服务器
app.listen(PORT, () => {
    console.log(`服务器运行在 http://10.1.21.144:${PORT}`);
    console.log(`AI服务地址: ${AI_SERVICE_URL}`);
});
